package com.glsc.ngateway.platform.service.other;

import cn.hutool.core.date.DateTime;
import com.glsc.ngateway.common.api.common.enums.DictConstant;
import com.glsc.ngateway.common.base.domain.mysql.gateway.other.SystemLicenseExpire;
import com.glsc.ngateway.common.base.repo.mysql.gateway.other.SystemLicenseExpireRepository;
import com.glsc.ngateway.common.api.common.utils.CommonUtils;
import com.glsc.ngateway.common.api.common.ex.GatewayException;
import com.glsc.ngateway.common.api.common.utils.PageUtil;
import com.glsc.ngateway.platform.service.MailService;
import com.glsc.ngateway.platform.utils.SpecificationUtil;
import org.apache.commons.lang.StringUtils;
import org.apache.poi.util.StringUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.*;

@Service
public class SystemLicenseExpireService {

    private static final Logger logger = LoggerFactory.getLogger(SystemLicenseExpireService.class);

    @Resource
    private SystemLicenseExpireRepository systemLicenseExpireRepository;

    @Resource
    private MailService mailService;


    public SystemLicenseExpire save(SystemLicenseExpire systemLicense) {
        if(StringUtils.isEmpty(systemLicense.getSystemName())){
            throw GatewayException.error("系统名称不能为空");
        }
        systemLicense.setSystemName(StringUtils.trim(systemLicense.getSystemName()));

        //校验管理员邮箱合法性
        if(StringUtils.isNotEmpty(systemLicense.getAdminEmail())){
            String emailStr=systemLicense.getAdminEmail();
            emailStr=emailStr.replace("，",",");//中英文逗号都替换为英文逗号

            String invalidEmail="";
            StringBuilder newEmailStr=new StringBuilder();
            for(String email:emailStr.split(",")){
                email=StringUtils.trim(email);
                newEmailStr.append(","+email);
                if( !CommonUtils.validEmail(email) ){
                    invalidEmail=invalidEmail+","+email;
                }
            }

            if(!"".equals(invalidEmail)) {
                if(invalidEmail.startsWith(",")){
                    invalidEmail=invalidEmail.substring(1);
                }
                throw GatewayException.error("管理员邮箱不合法，非法邮箱："+invalidEmail);
            }

            systemLicense.setAdminEmail(StringUtils.trim(newEmailStr.substring(1)));
        }

        if(null==systemLicense.getSystemId()) {//新增，则检查名称相同的是否已经存在
            List<SystemLicenseExpire> list = systemLicenseExpireRepository.findBySystemName(systemLicense.getSystemName());
            if (null != list && list.size() > 0) {
                if (!(null != systemLicense.getSystemId() && list.get(0).getSystemId() == systemLicense.getSystemId())) {//更新
                    throw GatewayException.error("名称为：" + systemLicense.getSystemName() + "的系统已经存在，如需修改请选择编辑");
                }
            }
        }

        return systemLicenseExpireRepository.save(systemLicense);
    }

    /**
     * 查找实体
     *
     * @param id
     * @return
     */
    public SystemLicenseExpire findById(Integer id) {
        Optional<SystemLicenseExpire> optional = systemLicenseExpireRepository.findById(id);
        if (optional.isPresent()) {
            return optional.get();
        } else {
            return null;
        }
    }

    public void deleteById(Integer id) {
        systemLicenseExpireRepository.deleteById(id);
    }

    /**
     * 分页条件查询
     *
     * @param pageNo
     * @param pageSize
     * @param param
     * @return
     */
    public Page<SystemLicenseExpire> findPage(int pageNo, int pageSize, Map<String, Object> param) {
        Sort.Direction direction = Sort.Direction.DESC;
        String sort = "systemId";

        pageNo= PageUtil.initPageNo(pageNo);
        pageSize=PageUtil.initPageSize(pageSize);

        Pageable pageable = PageRequest.of(pageNo - 1, pageSize, direction, sort);
        return systemLicenseExpireRepository.findAll(SpecificationUtil.buildSpecification(param, SystemLicenseExpire.class), pageable);
    }

    /**
     * 根据条件查询List
     */
    public List<SystemLicenseExpire> findList(Map<String, Object> param) {
        return systemLicenseExpireRepository.findAll(SpecificationUtil.buildSpecification(param, SystemLicenseExpire.class));
    }

    /**
     * 查询全部数据
     */
    public List<SystemLicenseExpire> findAll() {
        return systemLicenseExpireRepository.findAll();
    }

    /**
     * 到期提醒
     */
    public void timeEndNotify() {
        List<SystemLicenseExpire> systemList = this.findAll();

        //邮件已发送信息list
        List<String> sendMailList = new ArrayList<>();


        //遍历产品列表，发送邮件通知
        for (SystemLicenseExpire systemLicenseExpire : systemList) {

            LinkedHashMap<String, String> needCheckExpireMap = new LinkedHashMap<>();//所有需要检查有效期的事件
            LinkedHashMap<String, String> expiredMap = new LinkedHashMap<>();//所有需要检查有效期的事件

            if (!StringUtils.isEmpty(systemLicenseExpire.getSystemLicenseExpire())) {
                needCheckExpireMap.put(systemLicenseExpire.getSystemName(), StringUtils.trim(systemLicenseExpire.getSystemLicenseExpire()));
            }
            if (null != systemLicenseExpire.getModuleSet()) {
                systemLicenseExpire.getModuleSet().forEach(item -> {
                    if (!StringUtils.isEmpty(item.getModuleLicenseExpireDate())) {
                        needCheckExpireMap.put("子模块：" + item.getModuleName(), StringUtils.trim(item.getModuleLicenseExpireDate()));
                    }
                });
            }


            int remindBeforeDays = systemLicenseExpire.getBeforeRemindDays();
            if (remindBeforeDays < 3) {
                remindBeforeDays = 3;//至少提前3天通知
            }

            int finalRemindBeforeDays = remindBeforeDays;
            needCheckExpireMap.forEach((key, value) -> {
                Long betweenDays = CommonUtils.dateDiff(value, CommonUtils.getCurrentDateStr());
                if (null != betweenDays && (betweenDays == finalRemindBeforeDays || (betweenDays < finalRemindBeforeDays && betweenDays % 3 == 0) || betweenDays <= 3)) {//指定提前天数以及提前每3天提醒一次
                    expiredMap.put(key, value);//已经到期
                }
            });

            if (expiredMap.size() == 0) {
                continue;//继续检查下一个
            } else {
                StringBuilder mailContent = new StringBuilder();
                mailContent.append("国联证券" + systemLicenseExpire.getSystemName());
                mailContent.append("系统管理员您好，该系统License授权到期提醒，请您提前处理：<br/>");
                expiredMap.forEach((key, value) -> {
                    mailContent.append(key);
                    mailContent.append("  的License到期日为" + value + "。<br/>");
                });

                List<String> mailList = CommonUtils.mailList(systemLicenseExpire.getAdminEmail(), ",");
                String title = systemLicenseExpire.getSystemName() + " 系统License到期提醒";
                String mailId = mailService.sendMail(mailList.toArray(new String[mailList.size()]), null, title, mailContent.toString(), null);

                logger.info(DictConstant.JOB_REMIN_SYSTEM_LICENSE_EXPIRE + title);
                logger.info(DictConstant.JOB_REMIN_SYSTEM_LICENSE_EXPIRE + mailContent.toString());
            }
        }

        String curSysdate = new DateTime().toString();
        //任务执行后，向管理员发送邮件任务数据
        String content = "当前日期： " + curSysdate + " , 网关系统License到期提醒，邮件共发送：" + sendMailList.size() + "条，接收人信息为： " +
                StringUtil.join(sendMailList.toArray(), "，") + "。";
        //不发邮件提醒
//        mailService.sendMailToAdmin("网关系统License到期提醒", content);
    }
}
